home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-04-18 | 56.2 KB | 2,218 lines |
-
- /RE
- {
- findfont begin
- currentdict dup length dict begin
- {
- 1 index /FID ne {def}{pop pop}ifelse
- }forall
- /FontName exch def dup length 0 ne
- {
- /Encoding Encoding 256 array copy def
- 0 exch
- {
- dup type /nametype eq
- {
- Encoding 2 index 2 index put
- pop 1 add
- }
- {
- exch pop
- }ifelse
- }forall
- }if pop
- currentdict dup end end
- /FontName get exch definefont pop
- } bind def
-
- /stdencoding [
- 39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis
- /Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute
- /egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde
- /oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex
- /udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
- /registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash
- /.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef
- /.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash
- /questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef
- /guillemotleft/guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe
- /endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide
- /.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright
- /fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand
- /Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex
- /Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex
- /Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla
- /hungarumlaut/ogonek/caron
- ] def
- stdencoding /_Helvetica /Helvetica RE
- stdencoding /_Helvetica-Oblique /Helvetica-Oblique RE
- stdencoding /_Helvetica-Bold /Helvetica-Bold RE
- stdencoding /_Helvetica-BoldOblique /Helvetica-BoldOblique RE
-
- /Monaco10 /_Helvetica findfont 10 scalefont def
- /MonacoI10 /_Helvetica-Oblique findfont 10 scalefont def
- /MonacoB10 /_Helvetica-Bold findfont 10 scalefont def
- /MonacoBI10 /_Helvetica-BoldOblique findfont 10 scalefont def
- /Monaco9 /_Helvetica findfont 9 scalefont def
- /MonacoI9 /_Helvetica-Oblique findfont 9 scalefont def
-
- /defaultHeight 30 def /ifDefaultHeight 40 def /defaultWidth 60 def
- /pointSize 3 def /diamondWidth 8 def /pyramidWidth 18 def
- /eventBoxWidth 9 def
-
- /drawClassBox % oper1 ... opern noOfOpers attr1 ... attrn noOfAttrs name abstract nested
- {
- 50 dict begin
- /nested exch def /abstract exch def
- /name exch def
-
- false abstract eq { MonacoB10 setfont }{ MonacoBI10 setfont } ifelse
-
- /maxwidth name stringwidth pop def
- /boxwidth defaultWidth def
-
- /noOfAttr exch def /AttrArray noOfAttr array def /index noOfAttr 1 sub def {
- index -1 eq { exit } if
- AttrArray index 3 -1 roll put
- /index index 1 sub def
- } loop
-
- /noOfOper exch def /OperArray noOfOper array def /index noOfOper 1 sub def {
- index -1 eq { exit } if
- OperArray index 3 -1 roll put
- /index index 1 sub def
- } loop
-
- % Set font size for attributes an operations while checking boxwidth
- false abstract eq { Monaco9 setfont }{ MonacoI9 setfont } ifelse
- /leftmargin currentpoint pop def /topmargin currentpoint exch pop def
- AttrArray {
- stringwidth pop 8 add dup
- maxwidth gt { /maxwidth exch def }{ pop } ifelse
- } forall
- OperArray {
- stringwidth pop 8 add dup
- maxwidth gt { /maxwidth exch def }{ pop } ifelse
- } forall
-
- % Set back font size for the class name
- false abstract eq { MonacoB10 setfont }{ MonacoBI10 setfont } ifelse
- maxwidth boxwidth 6 sub gt { /boxwidth maxwidth 6 add def } if
- noOfAttr 0 ne { /boxheight noOfAttr 12 mul 26 add def } if
- noOfOper 0 ne { noOfAttr 0 ne { /boxheight boxheight 6 add noOfOper 12 mul add def }
- { /boxheight noOfOper 12 mul 26 add def } ifelse } if
- noOfOper 0 eq { noOfAttr 0 eq { /boxheight defaultHeight def } if } if
- boxheight defaultHeight lt { /boxheight defaultHeight def } if
- nested true eq { [3] 0 setdash } if
- currentpoint boxwidth 0 rlineto
- 0 boxheight neg rlineto
- boxwidth neg 0 rlineto closepath gsave 1 setgray fill grestore stroke
- nested true eq { [] 0 setdash } if
-
- noOfAttr 0 ne { leftmargin topmargin -18 add moveto boxwidth 0 rlineto stroke } if
-
- noOfOper 0 ne
- {
- newpath noOfAttr 0 ne { leftmargin topmargin -24 add noOfAttr -12 mul add moveto }
- { leftmargin topmargin -20 add moveto }ifelse
- boxwidth 0 rlineto stroke
- }if
- moveto currentpoint
- boxwidth name stringwidth pop sub 2 div -14 rmoveto name show
-
- false abstract eq { Monaco9 setfont }{ MonacoI9 setfont } ifelse
- currentpoint /index 0 def
- AttrArray
- {
- leftmargin 8 add topmargin moveto
- 0 -12 index mul -30 add rmoveto show
- /index index 1 add def
- } forall
- moveto currentpoint /index 0 def
- OperArray
- {
- leftmargin 8 add topmargin moveto
- noOfAttr 0 ne { 0 -12 index mul noOfAttr -12 mul add 38 sub rmoveto }
- { 0 -12 index mul 32 sub rmoveto }ifelse show
- /index index 1 add def
- } forall
- leftmargin boxwidth add topmargin boxheight sub
- end
- } def
- /drawInterfaceBox % oper1 ... opern noOfOpers attr1 ... attrn noOfAttrs name drawInterfaceBox
- {
- 50 dict begin
- /name exch def
-
- MonacoB10 setfont
-
- /maxwidth name stringwidth pop def
- /boxwidth defaultWidth def
-
- /noOfAttr exch def /AttrArray noOfAttr array def /index noOfAttr 1 sub def {
- index -1 eq { exit } if
- AttrArray index 3 -1 roll put
- /index index 1 sub def
- } loop
-
- /noOfOper exch def /OperArray noOfOper array def /index noOfOper 1 sub def {
- index -1 eq { exit } if
- OperArray index 3 -1 roll put
- /index index 1 sub def
- } loop
-
- % Set font size for attributes an operations while checking boxwidth
- Monaco9 setfont
- /leftmargin currentpoint pop def /topmargin currentpoint exch pop def
- AttrArray {
- stringwidth pop 8 add dup
- maxwidth gt { /maxwidth exch def }{ pop } ifelse
- } forall
- OperArray {
- stringwidth pop 8 add dup
- maxwidth gt { /maxwidth exch def }{ pop } ifelse
- } forall
-
- MonacoB10 setfont
- maxwidth boxwidth 6 sub gt { /boxwidth maxwidth 6 add def } if
- noOfAttr 0 ne { /boxheight noOfAttr 12 mul 36 add def } if
- noOfOper 0 ne { noOfAttr 0 ne { /boxheight boxheight 6 add noOfOper 12 mul add def }
- { /boxheight noOfOper 12 mul 36 add def } ifelse } if
- noOfOper 0 eq { noOfAttr 0 eq { /boxheight ifDefaultHeight def } if } if
- boxheight ifDefaultHeight lt { /boxheight ifDefaultHeight def } if
- currentpoint boxwidth 0 rlineto
- 0 boxheight neg rlineto
- boxwidth neg 0 rlineto closepath gsave 1 setgray fill grestore stroke
-
- noOfAttr 0 ne { leftmargin topmargin -28 add moveto boxwidth 0 rlineto stroke } if
-
- noOfOper 0 ne
- {
- newpath noOfAttr 0 ne { leftmargin topmargin -34 add noOfAttr -12 mul add moveto }
- { leftmargin topmargin -28 add moveto }ifelse
- boxwidth 0 rlineto stroke
- }if
- moveto currentpoint
- boxwidth name stringwidth pop sub 2 div -24 rmoveto name show
- leftmargin topmargin moveto
- boxwidth («interface») stringwidth pop sub 2 div -14 rmoveto («interface») show
-
- Monaco9 setfont
- currentpoint /index 0 def
- AttrArray
- {
- leftmargin 8 add topmargin 10 sub moveto
- 0 -12 index mul -30 add rmoveto show
- /index index 1 add def
- } forall
- moveto currentpoint /index 0 def
- OperArray
- {
- leftmargin 8 add topmargin 10 sub moveto
- noOfAttr 0 ne { 0 -12 index mul noOfAttr -12 mul add 38 sub rmoveto }
- { 0 -12 index mul 32 sub rmoveto }ifelse show
- /index index 1 add def
- } forall
- leftmargin boxwidth add topmargin boxheight sub
- end
- } def
-
- /arrowdict 15 dict def
- arrowdict begin
- /mtrx matrix def
- end
-
- /drawArrow % tailx taily tipx tipy halfthickness halfheadthickness headlength dashed filled drawArrow
- { arrowdict begin
- /filled exch def
- /dashed exch def
- /headlength exch def
- /halfheadthickness exch 2 div def
- /halfthickness exch 2 div def
- /tipy exch def /tipx exch def
- /taily exch def /tailx exch def
-
- /dx tipx tailx sub def
- /dy tipy taily sub def
- /arrowlength dx dx mul dy dy mul add sqrt def
- /angle dy dx atan def
- /arrowlength arrowlength headlength add def
- /base arrowlength headlength sub def
- /savematrix mtrx currentmatrix def
- tailx taily translate
- angle rotate
- base halfthickness neg moveto
- base halfheadthickness neg lineto
- arrowlength 0 lineto
- base halfheadthickness lineto
- base halfthickness lineto
- closepath
- filled true eq { fill }{ gsave 1 setgray fill grestore stroke } ifelse
- savematrix setmatrix
- newpath 1 setlinewidth
- tailx taily translate
- angle rotate
- dashed true eq { [3] 0 setdash }if
- 0 0 moveto base 0 lineto stroke
- dashed true eq { [] 0 setdash }if
- savematrix setmatrix
- end
- } def
-
- /navarrowdict 15 dict def
- navarrowdict begin
- /mtrx matrix def
- end
-
- /drawNavArrow % tailx taily tipx tipy halfthickness halfheadthickness headlength dashed drawNavArrow
- { navarrowdict begin
- /dashed exch def
- /headlength exch def
- /halfheadthickness exch 2 div def
- /halfthickness exch 2 div def
- /tipy exch def /tipx exch def
- /taily exch def /tailx exch def
-
- /dx tipx tailx sub def
- /dy tipy taily sub def
- /arrowlength dx dx mul dy dy mul add sqrt halfthickness sub def
- /angle dy dx atan def
- /base arrowlength headlength sub def
- /savematrix mtrx currentmatrix def
- tailx taily translate
- angle rotate
- base halfheadthickness neg moveto
- arrowlength 0 lineto
- base halfheadthickness lineto
- 0 setgray stroke
- savematrix setmatrix
- newpath 1 setlinewidth
- tailx taily translate
- angle rotate
- dashed true eq { [3] 0 setdash }if
- 0 0 moveto arrowlength 0 lineto stroke
- dashed true eq { [] 0 setdash }if
- savematrix setmatrix
- end
- } def
-
- /drawAssoc % pointn ... point1 noOfPoints branchRole branchMultText branchMult branchQualPos branchQual branchNavi baseRole baseMultText baseMult baseQualPos baseQual baseNavi name
- {
- 50 dict begin
- Monaco9 setfont
-
- /name exch def /baseNavi exch def /baseQual exch def /baseQualPos exch def /baseMult exch def /baseMultText exch def /baseRole exch def
- /branchNavi exch def /branchQual exch def /branchQualPos exch def /branchMult exch def /branchMultText exch def /branchRole exch def
- /noOfPoints exch def /pntArray noOfPoints 2 mul array def /index 0 def
- {
- index noOfPoints 2 mul eq { exit } if
- pntArray index 3 -1 roll put
- /index index 1 add def
- } loop
-
- % Get the base qualifier's position
-
- /baseQualTW baseQual stringwidth pop def
- /p1.h pntArray noOfPoints 1 sub 2 mul 1 add get def
- /p1.v pntArray noOfPoints 1 sub 2 mul get def
- /connect.h p1.h def
- /connect.v p1.v def
- baseQualPos 1 eq
- { % to the left of the first point
- baseMult 1 eq {
- /connect.h connect.h pointSize 2 div 2 add add def
- } if
- baseMult 2 eq {
- /connect.h connect.h pointSize 2 div 2 add add def
- } if
- } if
- baseQualPos 2 eq
- { % above the first point
- baseMult 1 eq {
- /connect.v connect.v pointSize 2 div 2 add sub def
- } if
- baseMult 2 eq {
- /connect.v connect.v pointSize 2 div 2 add sub def
- } if
- } if
- baseQualPos 3 eq
- { % to the right of the first point
- baseMult 1 eq {
- /connect.h connect.h pointSize 2 div 2 add sub def
- } if
- baseMult 2 eq {
- /connect.h connect.h pointSize 2 div 2 add sub def
- } if
- } if
- baseQualPos 4 eq
- { % below the first point
- baseMult 1 eq {
- /connect.v connect.v pointSize 2 div 2 add add def
- } if
- baseMult 2 eq {
- /connect.v connect.v pointSize 2 div 2 add add def
- } if
- } if
- baseQualPos 1 eq
- { % to the left of the first point
- /p1.h connect.h baseQualTW 5 add sub def
- /p1.v connect.v 3 sub def
- } if
- baseQualPos 2 eq
- { % above the first point
- /p1.h connect.h baseQualTW 2 div sub def
- /p1.v connect.v 4 add def
- } if
- baseQualPos 3 eq
- { % to the right of the first point
- /p1.h connect.h 6 add def
- /p1.v connect.v 3 sub def
- } if
- baseQualPos 4 eq
- { % below the first point
- /p1.h connect.h baseQualTW 2 div sub def
- /p1.v connect.v 10 sub def
- } if
- /baseQualText.h p1.h def
- /baseQualText.v p1.v def
-
- baseNavi 1 eq {
- /p1.h pntArray noOfPoints 1 sub 2 mul 1 add get def
- /p1.v pntArray noOfPoints 1 sub 2 mul get def
- /p2.h pntArray noOfPoints 2 sub 2 mul 1 add get def
- /p2.v pntArray noOfPoints 2 sub 2 mul get def
- p2.h p2.v p1.h p1.v 1 5 5 false drawNavArrow
- }if
- branchNavi 1 eq {
- /p1.h pntArray 1 get def
- /p1.v pntArray 0 get def
- /p2.h pntArray 3 get def
- /p2.v pntArray 2 get def
- p2.h p2.v p1.h p1.v 1 5 5 false drawNavArrow
- }if
-
- /lineConnect.h connect.h def
- /lineConnect.v connect.v def
-
- % Determine the qualifiers rectangle size
- baseQualTW 0 ne
- {
- baseQualPos 1 eq
- { % to the left of the first class
- /RectRight connect.h def
- /RectLeft baseQualText.h 5 sub def
- /lineConnect.h RectLeft def
- /RectTop baseQualText.v 12 add def
- /RectBottom RectTop 16 sub def
- } if
- baseQualPos 3 eq
- { % to the right of the first class
- /RectLeft connect.h def
- /RectRight baseQualText.h baseQualTW 5 add add def
- /lineConnect.h RectRight def
- /RectTop baseQualText.v 12 add def
- /RectBottom RectTop 16 sub def
- } if
- baseQualPos 2 eq
- { % above the first point
- /RectBottom connect.v def
- /RectTop RectBottom 16 add def
- /lineConnect.v RectTop def
- /RectLeft baseQualText.h 4 sub def
- /RectRight RectLeft baseQualTW 9 add add def
- } if
- baseQualPos 4 eq
- { % below the first point
- /RectTop connect.v def
- /RectBottom RectTop 16 sub def
- /lineConnect.v RectBottom def
- /RectLeft baseQualText.h 4 sub def
- /RectRight RectLeft baseQualTW add 9 add def
- } if
- RectLeft RectTop moveto
- RectRight RectTop lineto
- RectRight RectBottom lineto
- RectLeft RectBottom lineto
- closepath stroke
- newpath
- baseQualText.h baseQualText.v moveto
- baseQual show
- } if
-
- newpath 1 setlinewidth 0 setgray
- /index 0 def
- {
- index noOfPoints eq { exit } if
- pntArray index 2 mul 1 add get pntArray index 2 mul get
- index noOfPoints 1 sub eq { pop pop lineConnect.h lineConnect.v } if
- index 0 eq { moveto }{ lineto } ifelse
- /index index 1 add def
- } loop
- stroke
- /circle.h pntArray noOfPoints 1 sub 2 mul 1 add get def
- /circle.v pntArray noOfPoints 1 sub 2 mul get def
- baseQualTW 0 ne
- {
- baseQualPos 1 eq
- { % to the left of the first class
- /circle.h circle.h baseQualTW 9 add sub def
- } if
- baseQualPos 3 eq
- { % to the right of the first class
- /circle.h circle.h baseQualTW 11 add add def
- } if
- baseQualPos 2 eq
- { % above the first point
- /circle.v circle.v 16 add def
- } if
- baseQualPos 4 eq
- { % below the first point
- /circle.v circle.v 16 sub def
- } if
- } if
- circle.h circle.v
- baseMult 1 eq {
- % hollow circle
- pointSize 0.5 sub 0 360 arc stroke
- circle.h circle.v
- pointSize 1 sub 0 360 arc 1 setgray fill
- } if
- baseMult 2 eq {
- % filled circle
- pointSize 0.5 sub 0 360 arc gsave stroke grestore 0 setgray fill
- } if
-
- 0 setgray /p1.h pntArray noOfPoints 1 sub 2 mul 1 add get def
- /p1.v pntArray noOfPoints 1 sub 2 mul get def
- /p2.h pntArray noOfPoints 2 sub 2 mul 1 add get def
- /p2.v pntArray noOfPoints 2 sub 2 mul get def
- /roletextwidth baseRole stringwidth pop def
-
- p1.h p2.h eq
- { p1.v p2.v le
- { p1.h 5 add p1.v 4 add baseQualTW 0 ne { 14 add } if }
- { p1.h 5 add p1.v 10 sub baseQualTW 0 ne { 14 sub } if } ifelse
- }
- { p1.v p2.v eq
- { p1.h p2.h gt
- { p1.h roletextwidth 5 add sub baseQualTW 0 ne { baseQualTW 9 add sub } if p1.v 10 sub }
- { p1.h 6 add baseQualTW 0 ne { baseQualTW 7 add add } if p1.v 10 sub } ifelse
- }
- { p1.v p2.v le
- { p1.h p2.h gt
- { p1.h roletextwidth 5 add sub p1.v 4 add baseQualTW 0 ne { 14 add } if }
- { p1.h 6 add p1.v 4 add baseQualTW 0 ne { 14 add } if } ifelse
- }
- { p1.h p2.h gt
- { p1.h roletextwidth 5 add sub p1.v 10 sub baseQualTW 0 ne { 14 sub } if }
- { p1.h 6 add p1.v 10 sub baseQualTW 0 ne { 14 sub } if } ifelse
- } ifelse
- } ifelse
- } ifelse
- moveto baseRole show
- /p1.h pntArray noOfPoints 1 sub 2 mul 1 add get def
- /p1.v pntArray noOfPoints 1 sub 2 mul get def
- /p2.h pntArray noOfPoints 2 sub 2 mul 1 add get def
- /p2.v pntArray noOfPoints 2 sub 2 mul get def
- /multtextwidth baseMultText stringwidth pop def
-
- p1.h p2.h eq
- { p1.v p2.v le
- { p1.h multtextwidth 5 add sub p1.v 4 add baseQualTW 0 ne { 14 add } if }
- { p1.h multtextwidth 5 add sub p1.v 10 sub baseQualTW 0 ne { 14 sub } if } ifelse
- }
- { p1.v p2.v eq
- { p1.h p2.h gt
- { p1.h multtextwidth 5 add sub baseQualTW 0 ne { baseQualTW 9 add sub } if p1.v 4 add }
- { p1.h 5 add baseQualTW 0 ne { baseQualTW 7 add add } if p1.v 4 add } ifelse
- }
- { p1.v p2.v le
- { p1.h p2.h gt
- { p1.h multtextwidth 5 add sub p1.v 4 add baseQualTW 0 ne { 14 add } if }
- { p1.h 5 add p1.v 4 add baseQualTW 0 ne { 14 add } if } ifelse
- }
- { p1.h p2.h gt
- { p1.h multtextwidth 5 add sub p1.v 10 sub baseQualTW 0 ne { 14 sub } if }
- { p1.h 5 add p1.v 10 sub baseQualTW 0 ne { 14 sub } if } ifelse
- } ifelse
- } ifelse
- } ifelse
- moveto
- baseMult 3 eq {
- baseMultText show
- } if
-
- newpath
- % Get the branch qualifier's position
-
- /branchQualTW branchQual stringwidth pop def
- /p1.h pntArray 1 get def
- /p1.v pntArray 0 get def
- /connect.h p1.h def
- /connect.v p1.v def
- branchQualPos 1 eq
- { % to the left of the first point
- branchMult 1 eq {
- /connect.h connect.h pointSize 2 div 2 add add def
- } if
- branchMult 2 eq {
- /connect.h connect.h pointSize 2 div 2 add add def
- } if
- /p1.h connect.h branchQualTW 5 add sub def
- /p1.v connect.v 3 sub def
- } if
- branchQualPos 2 eq
- { % above the first point
- branchMult 1 eq {
- /connect.v connect.v pointSize 2 div 2 add sub def
- } if
- branchMult 2 eq {
- /connect.v connect.v pointSize 2 div 2 add sub def
- } if
- /p1.h connect.h branchQualTW 2 div sub def
- /p1.v connect.v 4 add def
- } if
- branchQualPos 3 eq
- { % to the right of the first point
- branchMult 1 eq {
- /connect.h connect.h pointSize 2 div 2 add sub def
- } if
- branchMult 2 eq {
- /connect.h connect.h pointSize 2 div 2 add sub def
- } if
- /p1.h connect.h 6 add def
- /p1.v connect.v 3 sub def
- } if
- branchQualPos 4 eq
- { % below the first point
- branchMult 1 eq {
- /connect.v connect.v pointSize 2 div 2 add add def
- } if
- branchMult 2 eq {
- /connect.v connect.v pointSize 2 div 2 add add def
- } if
- /p1.h connect.h branchQualTW 2 div sub def
- /p1.v connect.v 10 sub def
- } if
- /branchQualText.h p1.h def
- /branchQualText.v p1.v def
-
- /lineConnect.h connect.h def
- /lineConnect.v connect.v def
-
- % Determine the qualifiers rectangle size
- branchQualTW 0 ne
- {
- branchQualPos 1 eq
- { % to the left of the first class
- /RectRight connect.h def
- /RectLeft branchQualText.h 5 sub def
- /lineConnect.h RectLeft def
- /RectTop branchQualText.v 12 add def
- /RectBottom RectTop 16 sub def
- } if
- branchQualPos 3 eq
- { % to the right of the first class
- /RectLeft connect.h def
- /RectRight branchQualText.h branchQualTW 5 add add def
- /lineConnect.h RectRight def
- /RectTop branchQualText.v 12 add def
- /RectBottom RectTop 16 sub def
- } if
- branchQualPos 2 eq
- { % above the first point
- /RectBottom connect.v def
- /RectTop RectBottom 16 add def
- /lineConnect.v RectTop def
- /RectLeft branchQualText.h 4 sub def
- /RectRight RectLeft branchQualTW 9 add add def
- } if
- branchQualPos 4 eq
- { % below the first point
- /RectTop connect.v def
- /RectBottom RectTop 16 sub def
- /lineConnect.v RectBottom def
- /RectLeft branchQualText.h 4 sub def
- /RectRight RectLeft branchQualTW add 9 add def
- } if
- RectLeft RectTop moveto
- RectRight RectTop lineto
- RectRight RectBottom lineto
- RectLeft RectBottom lineto
- closepath gsave 1 setgray fill grestore stroke
- newpath
- branchQualText.h branchQualText.v moveto
- branchQual show
- } if
- newpath
- 0 setgray
- /circle.h pntArray 1 get def
- /circle.v pntArray 0 get def
- branchQualTW 0 ne
- {
- branchQualPos 1 eq
- { % to the left of the first class
- /circle.h circle.h branchQualTW 9 add sub def
- } if
- branchQualPos 3 eq
- { % to the right of the first class
- /circle.h circle.h branchQualTW 11 add add def
- } if
- branchQualPos 2 eq
- { % above the first point
- /circle.v circle.v 16 add def
- } if
- branchQualPos 4 eq
- { % below the first point
- /circle.v circle.v 16 sub def
- } if
- } if
- circle.h circle.v
- branchMult 1 eq {
- % hollow circle
- pointSize 0.5 sub 0 360 arc stroke
- circle.h circle.v
- pointSize 1 sub 0 360 arc 1 setgray fill
- } if
- branchMult 2 eq {
- % filled circle
- pointSize 0.5 sub 0 360 arc gsave stroke grestore 0 setgray fill
- } if
-
- 0 setgray
- /p1.h pntArray 1 get def
- /p1.v pntArray 0 get def
- /p2.h pntArray 3 get def
- /p2.v pntArray 2 get def
- /roletextwidth branchRole stringwidth pop def
-
- p1.h p2.h eq
- { p1.v p2.v le
- { p1.h 5 add p1.v 4 add branchQualTW 0 ne { 14 add } if }
- { p1.h 5 add p1.v 10 sub branchQualTW 0 ne { 14 sub } if } ifelse
- }
- { p1.v p2.v eq
- { p1.h p2.h gt
- { p1.h roletextwidth 5 add sub branchQualTW 0 ne { branchQualTW 9 add sub } if p1.v 10 sub }
- { p1.h 5 add branchQualTW 0 ne { branchQualTW 7 add add } if p1.v 10 sub } ifelse
- }
- { p1.v p2.v le
- { p1.h p2.h gt
- { p1.h roletextwidth 5 add sub p1.v 4 add branchQualTW 0 ne { 14 add } if }
- { p1.h 5 add p1.v 4 add branchQualTW 0 ne { 14 add } if } ifelse
- }
- { p1.h p2.h gt
- { p1.h roletextwidth 5 add add p1.v 0 sub branchQualTW 0 ne { 14 sub } if }
- { p1.h 5 add p1.v 10 sub branchQualTW 0 ne { 14 sub } if } ifelse
- } ifelse
- } ifelse
- } ifelse
- moveto branchRole show
- /p1.h pntArray 1 get def
- /p1.v pntArray 0 get def
- /p2.h pntArray 3 get def
- /p2.v pntArray 2 get def
- /multtextwidth branchMultText stringwidth pop def
-
- p1.h p2.h eq
- { p1.v p2.v le
- { p1.h multtextwidth 5 add sub p1.v 4 add branchQualTW 0 ne { 14 add } if }
- { p1.h multtextwidth 5 add sub p1.v 10 sub branchQualTW 0 ne { 14 sub } if } ifelse
- }
- { p1.v p2.v eq
- { p1.h p2.h gt
- { p1.h multtextwidth 5 add sub branchQualTW 0 ne { branchQualTW 9 add sub } if p1.v 4 add }
- { p1.h 5 add branchQualTW 0 ne { branchQualTW 7 add add } if p1.v 4 add } ifelse
- }
- { p1.v p2.v le
- { p1.h p2.h gt
- { p1.h multtextwidth 5 add sub p1.v 4 add branchQualTW 0 ne { 14 add } if }
- { p1.h 5 add p1.v 4 add branchQualTW 0 ne { 14 add } if } ifelse
- }
- { p1.h p2.h gt
- { p1.h multtextwidth 5 add sub p1.v 10 sub branchQualTW 0 ne { 14 sub } if }
- { p1.h 5 add p1.v 10 sub branchQualTW 0 ne { 14 sub } if } ifelse
- } ifelse
- } ifelse
- } ifelse
- moveto
- branchMult 3 eq {
- branchMultText show
- }if
- end
- } def
-
- /drawAggr % [ pointn ... point1 noOfPoints branchRole branchMultText branchMult navigable ] noOfBranches
- % pointn ... point1 noOfPoints baseRole baseMultText baseMult navigable qualPos qualifier name byvalue diamondx diamondy
- {
- 70 dict begin
- Monaco9 setfont
-
- /diay exch def
- /diax exch def
- /byvalue exch def
- /name exch def /qualifier exch def /qualPos exch def /baseNavigable exch def /baseMult exch def /baseMultText exch def
- /baseRole exch def
- /noOfStemPoints exch def
- /stemArray noOfStemPoints 2 mul array def
- /index 0 def
- {
- index noOfStemPoints 2 mul eq { exit } if
- stemArray index 3 -1 roll put
- /index index 1 add def
- } loop
-
- % Get the qualifier's position
-
- /qualTW qualifier stringwidth pop def
- /p1.h stemArray noOfStemPoints 1 sub 2 mul 1 add get def
- /p1.v stemArray noOfStemPoints 1 sub 2 mul get def
- /connect.h p1.h def
- /connect.v p1.v def
- qualPos 1 eq
- { % to the left of the first point
- /connect.h connect.h diamondWidth 0.5 add add def
- /p1.h connect.h qualTW 5 add sub def
- /p1.v connect.v 3 sub def
- } if
- qualPos 2 eq
- { % above the first point
- /connect.v connect.v diamondWidth 1 add sub def
- /p1.h connect.h qualTW 2 div sub def
- /p1.v connect.v 4 add def
- } if
- qualPos 3 eq
- { % to the right of the first point
- /connect.h connect.h diamondWidth sub def
- /p1.h connect.h 6 add def
- /p1.v connect.v 3 sub def
- } if
- qualPos 4 eq
- { % below the first point
- /connect.v connect.v diamondWidth 0.5 add add def
- /p1.h connect.h qualTW 2 div sub def
- /p1.v connect.v 10 sub def
- } if
- /qualText.h p1.h def
- /qualText.v p1.v def
-
- /lineConnect.h connect.h def
- /lineConnect.v connect.v def
-
- % Determine the qualifiers rectangle size
- qualTW 0 ne
- {
- qualPos 1 eq
- { % to the left of the first class
- /RectRight connect.h def
- /RectLeft qualText.h 5 sub def
- /lineConnect.h RectLeft def
- /RectTop qualText.v 12 add def
- /RectBottom RectTop 16 sub def
- } if
- qualPos 3 eq
- { % to the right of the first class
- /RectLeft connect.h def
- /RectRight qualText.h qualTW 5 add add def
- /lineConnect.h RectRight def
- /RectTop qualText.v 12 add def
- /RectBottom RectTop 16 sub def
- } if
- qualPos 2 eq
- { % above the first point
- /RectBottom connect.v def
- /RectTop RectBottom 16 add def
- /lineConnect.v RectTop def
- /RectLeft qualText.h 4 sub def
- /RectRight RectLeft qualTW 9 add add def
- } if
- qualPos 4 eq
- { % below the first point
- /RectTop connect.v def
- /RectBottom RectTop 16 sub def
- /lineConnect.v RectBottom def
- /RectLeft qualText.h 4 sub def
- /RectRight RectLeft qualTW add 9 add def
- } if
- RectLeft RectTop moveto
- RectRight RectTop lineto
- RectRight RectBottom lineto
- RectLeft RectBottom lineto
- closepath stroke
- newpath
- qualText.h qualText.v moveto
- qualifier show
- } if
-
- /noOfBranches exch def /branchesArray noOfBranches array def /index 0 def
- {
- index noOfBranches eq { exit } if
- /branchNavigable exch def
- /branchMult exch def /branchMultText exch def
- /branchRole exch def /noOfBranchPoints exch def
-
- noOfBranchPoints 0 ne {
- /pntArray noOfBranchPoints 2 mul array def
- /pntIndex 0 def
- {
- pntIndex noOfBranchPoints 2 mul eq { exit } if
- pntArray pntIndex 3 -1 roll put
- /pntIndex pntIndex 1 add def
- } loop
-
- /branchArray 6 array def
- branchArray 0 branchMult put branchArray 1 branchMultText put
- branchArray 2 branchRole put branchArray 3 noOfBranchPoints put
- branchArray 4 branchNavigable put branchArray 5 pntArray put
- }
- {
- /branchArray 5 array def
- branchArray 0 branchMult put branchArray 1 branchMultText put
- branchArray 2 branchRole put branchArray 3 noOfBranchPoints put
- branchArray 4 branchNavigable put
- } ifelse
- branchesArray index branchArray put
- /index index 1 add def
- } loop
- newpath 1 setlinewidth 0 setgray
-
- /p1.h stemArray noOfStemPoints 1 sub 2 mul 1 add get def
- /p1.v stemArray noOfStemPoints 1 sub 2 mul get def
- /p2.h stemArray noOfStemPoints 2 sub 2 mul 1 add get def
- /p2.v stemArray noOfStemPoints 2 sub 2 mul get def
- baseNavigable 1 eq
- {
- p2.h p2.v p1.h p1.v 1 5 5 false drawNavArrow
- }if
-
- /index 0 def
- {
- index noOfStemPoints eq { exit } if
- stemArray index 2 mul 1 add get stemArray index 2 mul get
- % index noOfStemPoints 1 sub eq { pop pop lineConnect.h lineConnect.v } if
- index 0 eq { moveto }{ lineto } ifelse
- /index index 1 add def
- } loop
- branchesArray
- {
- /branch exch def /branchMult branch 0 get def
- /branchNavigable branch 4 get def
- /branchMultText branch 1 get def /noOfPoints branch 3 get def
- noOfPoints 0 ne {
- /pntArray branch 5 get def
- /index 0 def
- {
- index noOfPoints eq { exit } if
- pntArray index 2 mul 1 add get pntArray index 2 mul get
- index 0 eq {
- branchNavigable 1 eq {
- pntArray 3 get pntArray 2 get pntArray 1 get pntArray 0 get 1 5 5 false drawNavArrow
- }if
- moveto
- }{
- lineto
- } ifelse
- /index index 1 add def
- } loop
- } if
- }forall
- stroke
- branchesArray
- {
- /branch exch def
- /branchMult branch 0 get def /branchMultText branch 1 get def
- /branchRole branch 2 get def /noOfPoints branch 3 get def
- noOfPoints 0 ne {
- /pntArray branch 5 get def
- newpath
- /p1.h pntArray 1 get def /p1.v pntArray 0 get def
- /p2.h pntArray 3 get def /p2.v pntArray 2 get def
- }
- {
- newpath
- /p1.h stemArray 1 get def /p1.v stemArray 0 get def
- /p2.h stemArray 3 get def /p2.v stemArray 2 get def
- } ifelse
-
- 0 setgray
-
- p1.h p1.v
- branchMult 1 eq {
- % hollow circle
- pointSize 0.5 sub 0 360 arc stroke
- p1.h p1.v
- pointSize 1 sub 0 360 arc 1 setgray fill
- } if
- branchMult 2 eq {
- % filled circle
- pointSize 0.5 sub 0 360 arc gsave stroke grestore 0 setgray fill
- } if
-
- 0 setgray
- /roletextwidth branchRole stringwidth pop def
-
- p1.h p2.h eq
- { p1.v p2.v le
- { p1.h 5 add p1.v 4 add }{ p1.h 5 add p1.v 10 sub } ifelse
- }
- { p1.v p2.v eq
- { p1.h p2.h gt
- { p1.h roletextwidth 5 add sub p1.v 10 sub }{ p1.h 5 add p1.v 10 sub } ifelse
- }
- { p1.v p2.v le
- { p1.h p2.h gt
- { p1.h roletextwidth 5 add sub p1.v 4 add }{ p1.h 5 add p1.v 4 add } ifelse
- }
- { p1.h p2.h gt
- { p1.h roletextwidth 5 add add p1.v 0 sub }
- { p1.h 5 add p1.v 10 sub } ifelse
- } ifelse
- } ifelse
- } ifelse
- moveto branchRole show
-
- noOfPoints 0 ne {
- /pntArray branch 5 get def
- newpath
- /p1.h pntArray 1 get def /p1.v pntArray 0 get def
- /p2.h pntArray 3 get def /p2.v pntArray 2 get def
- }
- {
- newpath
- /p1.h stemArray 1 get def /p1.v stemArray 0 get def
- /p2.h stemArray 3 get def /p2.v stemArray 2 get def
- } ifelse
- /multtextwidth branchMultText stringwidth pop def
- 0 setgray
-
- p1.h p2.h eq
- { p1.v p2.v le
- { p1.h multtextwidth 5 add sub p1.v 4 add }
- { p1.h multtextwidth 5 add sub p1.v 10 sub } ifelse
- }
- { p1.v p2.v eq
- { p1.h p2.h gt
- { p1.h multtextwidth 5 add sub p1.v 4 add }{ p1.h 5 add p1.v 4 add } ifelse
- }
- { p1.v p2.v le
- { p1.h p2.h gt
- { p1.h multtextwidth 5 add sub p1.v 4 add }{ p1.h 5 add p1.v 4 add } ifelse
- }
- { p1.h p2.h gt
- { p1.h multtextwidth 5 add sub p1.v 10 sub }{ p1.h 5 add p1.v 10 sub } ifelse
- } ifelse
- } ifelse
- } ifelse
- moveto
- branchMult 3 eq {
- branchMultText show
- }if
-
- }forall
- stroke
-
- 0 setgray
- /p1.h stemArray noOfStemPoints 1 sub 2 mul 1 add get def
- /p1.v stemArray noOfStemPoints 1 sub 2 mul get def
- /p2.h stemArray noOfStemPoints 2 sub 2 mul 1 add get def
- /p2.v stemArray noOfStemPoints 2 sub 2 mul get def
- /roletextwidth baseRole stringwidth pop def
-
- p1.h p2.h eq
- { p1.v p2.v le
- { p1.h 5 add p1.v 1 sub qualTW 0 ne { 14 add } if }
- { p1.h 5 add p1.v 1 sub qualTW 0 ne { 14 sub } if } ifelse
- }
- { p1.v p2.v eq
- { p1.h p2.h gt
- { p1.h roletextwidth 1 sub sub qualTW 0 ne { qualTW 9 add sub } if p1.v 10 sub }
- { p1.h 1 sub qualTW 0 ne { qualTW 7 add add } if p1.v 10 sub } ifelse
- }
- { p1.v p2.v le
- { p1.h p2.h gt
- { p1.h roletextwidth 5 add sub p1.v 4 add qualTW 0 ne { 14 add } if }
- { p1.h 6 add p1.v 4 add qualTW 0 ne { 14 add } if } ifelse
- }
- { p1.h p2.h gt
- { p1.h roletextwidth 5 add sub p1.v 10 sub qualTW 0 ne { 14 sub } if }
- { p1.h 6 add p1.v 10 sub qualTW 0 ne { 14 sub } if } ifelse
- } ifelse
- } ifelse
- } ifelse
- moveto baseRole show
-
- newpath
- p1.h p2.h eq
- { p1.v p2.v le
- { p1.h p1.v 3 add qualTW 0 ne { 15 add } if }
- { p1.h p1.v 3 sub qualTW 0 ne { 16 sub } if } ifelse
- }
- { p1.v p2.v eq
- { p1.h p2.h gt
- { p1.h 2 sub qualTW 0 ne { qualTW 10 add sub } if p1.v }
- { p1.h 2 add qualTW 0 ne { qualTW 12 add add } if p1.v } ifelse
- }
- { p1.v p2.v le
- { p1.h p2.h gt
- { p1.h pointSize 5 add sub p1.v 4 add qualTW 0 ne { 15 add } if }
- { p1.h 5 add p1.v 4 add qualTW 0 ne { 15 add } if } ifelse
- }
- { p1.h p2.h gt
- { p1.h pointSize 5 add sub p1.v 10 sub qualTW 0 ne { 15 sub } if }
- { p1.h 5 add p1.v 10 sub qualTW 0 ne { 15 sub } if } ifelse
- } ifelse
- } ifelse
- } ifelse
- /y exch def
- /x exch def
- x y
- baseMult 1 eq {
- % hollow circle
- pointSize 0.5 sub 0 360 arc stroke
- x y
- pointSize 1 sub 0 360 arc 1 setgray fill
- } if
- baseMult 2 eq {
- % filled circle
- pointSize 0.5 sub 0 360 arc gsave stroke grestore 0 setgray fill
- } if
-
- /multtextwidth baseMultText stringwidth pop def
-
- p1.h p2.h eq
- { p1.v p2.v le
- { p1.h multtextwidth 5 add sub p1.v 1 sub qualTW 0 ne { 14 add } if }
- { p1.h multtextwidth 5 add sub p1.v 1 sub qualTW 0 ne { 14 sub } if } ifelse
- }
- { p1.v p2.v eq
- { p1.h p2.h gt
- { p1.h multtextwidth 1 sub sub qualTW 0 ne { qualTW 9 add sub } if p1.v 4 add }
- { p1.h 1 sub qualTW 0 ne { qualTW 7 add add } if p1.v 4 add } ifelse
- }
- { p1.v p2.v le
- { p1.h p2.h gt
- { p1.h multtextwidth 5 add sub p1.v 4 add qualTW 0 ne { 14 add } if }
- { p1.h 5 add p1.v 4 add qualTW 0 ne { 14 add } if } ifelse
- }
- { p1.h p2.h gt
- { p1.h multtextwidth 5 add sub p1.v 10 sub qualTW 0 ne { 14 sub } if }
- { p1.h 5 add p1.v 10 sub qualTW 0 ne { 14 sub } if } ifelse
- } ifelse
- } ifelse
- } ifelse
- moveto
- baseMult 3 eq {
- baseMultText show
- } if
-
- newpath 1 setlinewidth
- qualTW 0 ne
- {
- qualPos 1 eq
- {
- /diax diax qualTW 9 add sub def
- } if
- qualPos 2 eq
- {
- /diay diay 16 add def
- } if
- qualPos 3 eq
- {
- /diax diax qualTW 11 add add def
- } if
- qualPos 4 eq
- {
- /diay diay 16 sub def
- } if
- } if
-
- diax diamondWidth 2 div sub 0.5 add diay moveto
-
- diamondWidth 2 div 1 sub diamondWidth 2 div 1 sub rlineto
- diamondWidth 2 div 1 sub diamondWidth 2 div 1 sub neg rlineto
- diamondWidth 2 div 1 sub neg diamondWidth 2 div 1 sub neg rlineto
- closepath
- byvalue 0 eq { 1 setgray }{ 0 setgray } ifelse fill
-
- newpath 1 setlinewidth 0 setgray
- diax diamondWidth 2 div sub diay moveto
-
- diamondWidth 2 div 0.5 sub diamondWidth 2 div 0.5 sub rlineto
- diamondWidth 2 div 0.5 sub diamondWidth 2 div 0.5 sub neg rlineto
- diamondWidth 2 div 0.5 sub neg diamondWidth 2 div 0.5 sub neg rlineto
- closepath stroke
-
- end
- } def
-
-
- /genarrowdict 15 dict def
- genarrowdict begin
- /mtrx matrix def
- end
-
- /drawGenArrow % tailx taily tipx tipy halfthickness halfheadthickness headlength dashed filled drawGenArrow
- { genarrowdict begin
- /filled exch def
- /dashed exch def
- /headlength exch def
- /halfheadthickness exch 2 div def
- /halfthickness exch 2 div def
- /tipy exch def /tipx exch def
- /taily exch def /tailx exch def
-
- /dx tipx tailx sub def
- /dy tipy taily sub def
- /arrowlength dx dx mul dy dy mul add sqrt halfthickness sub def
- /angle dy dx atan def
- /base arrowlength headlength sub def
- /savematrix mtrx currentmatrix def
- tailx taily translate
- angle rotate
- base halfthickness neg moveto
- base halfheadthickness neg lineto
- arrowlength 0 lineto
- base halfheadthickness lineto
- base halfthickness lineto
- closepath
- filled true eq { fill }{ gsave 1 setgray fill grestore stroke } ifelse
- savematrix setmatrix
- newpath 1 setlinewidth
- tailx taily translate
- angle rotate
- dashed true eq { [3] 0 setdash }if
- 0 0 moveto base 0 lineto stroke
- dashed true eq { [] 0 setdash }if
- savematrix setmatrix
- end
- } def
-
- % [ pointn ... point1 noOfPoints branchRole branchMultText branchMult navigable ] noOfBranches pointn ... point1 noOfPoints baseRole baseMultText baseMult qualPos qualifier name pyramidorientation pyramidx pyramidy omtNotation
- /drawGen
- {
- 50 dict begin
- Monaco9 setfont
-
- /omtNotation exch def
- /pyry exch def
- /pyrx exch def
- /orient exch def
- /name exch def
- /noOfStemPoints exch def
- /stemArray noOfStemPoints 2 mul array def
- /index 0 def
- {
- index noOfStemPoints 2 mul eq { exit } if
- stemArray index 3 -1 roll put
- /index index 1 add def
- } loop
-
- /noOfBranches exch def
- /branchesArray noOfBranches array def
-
- /index 0 def
- {
- index noOfBranches eq { exit } if
-
- /navigable exch def
- /branchMult exch def /branchMultText exch def
- /branchRole exch def /noOfBranchPoints exch def
-
- noOfBranchPoints 0 ne {
- /pntArray noOfBranchPoints 2 mul array def
- /pntIndex 0 def
- {
- pntIndex noOfBranchPoints 2 mul eq { exit } if
- pntArray pntIndex 3 -1 roll put
- /pntIndex pntIndex 1 add def
- } loop
-
- /branchArray 2 array def
- branchArray 0 noOfBranchPoints put branchArray 1 pntArray put
- }
- {
- /branchArray 1 array def
- branchArray 0 noOfBranchPoints put
- } ifelse
- branchesArray index branchArray put
- /index index 1 add def
- } loop
- newpath 1 setlinewidth 0 setgray
- /index 0 def
- {
- index noOfStemPoints eq { exit } if
- stemArray index 2 mul 1 add get stemArray index 2 mul get
- index 0 eq { moveto }{ lineto } ifelse
- /index index 1 add def
- } loop
-
- branchesArray
- {
- /branch exch def
- /noOfPoints branch 0 get def
- noOfPoints 0 ne {
- /pntArray branch 1 get def
- /index 0 def
- {
- index noOfPoints eq { exit } if
- pntArray index 2 mul 1 add get pntArray index 2 mul get
- index 0 eq { moveto }{ lineto } ifelse
- /index index 1 add def
- } loop
- }if
- }forall
- stroke
-
- newpath
- pyrx pyry moveto
-
- omtNotation 1 eq {
- orient 0 eq {
- pyramidWidth 2 div 1.6 sub 0 rlineto
- pyramidWidth 2 div 1.6 sub neg pyramidWidth 2 div 1.6 sub rlineto
- pyramidWidth 2 div 1.6 sub neg pyramidWidth 2 div 1.6 sub neg rlineto
- } if
- orient 2 eq {
- 0 pyramidWidth 2 div 1.6 sub rlineto
- pyramidWidth 2 div 1.6 sub neg pyramidWidth 2 div 1.6 sub neg rlineto
- pyramidWidth 2 div 1.6 sub pyramidWidth 2 div 1.6 sub neg rlineto
- } if
- orient 4 eq {
- pyramidWidth 2 div 1.6 sub neg 0 rlineto
- pyramidWidth 2 div 1.6 sub pyramidWidth 2 div 1.6 sub neg rlineto
- pyramidWidth 2 div 1.6 sub pyramidWidth 2 div 1.6 sub rlineto
- } if
- orient 6 eq {
- 0 pyramidWidth 2 div 1.6 sub neg rlineto
- pyramidWidth 2 div 1.6 sub pyramidWidth 2 div 1.6 sub rlineto
- pyramidWidth 2 div 1.6 sub neg pyramidWidth 2 div 1.6 sub rlineto
- } if
- closepath 1 setgray fill
-
- newpath 1 setlinewidth 0 setgray
- pyrx pyry moveto
-
- orient 0 eq {
- pyramidWidth 2 div 0.5 sub 0 rlineto
- pyramidWidth 2 div 0.5 sub neg pyramidWidth 2 div 0.5 sub rlineto
- pyramidWidth 2 div 0.5 sub neg pyramidWidth 2 div 0.5 sub neg rlineto
- } if
- orient 2 eq {
- 0 pyramidWidth 2 div 0.5 sub rlineto
- pyramidWidth 2 div 0.5 sub neg pyramidWidth 2 div 0.5 sub neg rlineto
- pyramidWidth 2 div 0.5 sub pyramidWidth 2 div 0.5 sub neg rlineto
- } if
- orient 4 eq {
- pyramidWidth 2 div 0.5 sub neg 0 rlineto
- pyramidWidth 2 div 0.5 sub pyramidWidth 2 div 0.5 sub neg rlineto
- pyramidWidth 2 div 0.5 sub pyramidWidth 2 div 0.5 sub rlineto
- } if
- orient 6 eq {
- 0 pyramidWidth 2 div 0.5 sub neg rlineto
- pyramidWidth 2 div 0.5 sub pyramidWidth 2 div 0.5 sub rlineto
- pyramidWidth 2 div 0.5 sub neg pyramidWidth 2 div 0.5 sub rlineto
- } if
- closepath stroke
- }
- {
- /i noOfStemPoints 2 mul def
- stemArray i 3 sub get stemArray i 4 sub get stemArray i 1 sub get stemArray i 2 sub get 1 15 20 false false drawGenArrow
- } ifelse
-
- end
- } def
-
- % pointn ... point1 noOfPoints name drawUCGen
- /drawUCGen
- {
- 50 dict begin
-
- /name exch def
- /noOfPoints exch def /pntArray noOfPoints 2 mul array def /index 0 def
- {
- index noOfPoints 2 mul eq { exit } if
- pntArray index 3 -1 roll put
- /index index 1 add def
- } loop
-
- Monaco9 setfont
- newpath 1 setlinewidth
- noOfPoints 2 gt {
- /index 0 def
- {
- index noOfPoints 1 sub eq { exit } if
- /p1.h pntArray index 2 mul 1 add get def
- /p1.v pntArray index 2 mul get def
- /p2.h pntArray index 1 add 2 mul 1 add get def
- /p2.v pntArray index 1 add 2 mul get def
- p1.h p1.v moveto p2.h p2.v lineto stroke
- /index index 1 add def
- } loop
- } if
-
- /p1.h pntArray 1 get def
- /p1.v pntArray 0 get def
- /p2.h pntArray 3 get def
- /p2.v pntArray 2 get def
- p2.h p2.v p1.h p1.v 1 15 20 false false drawGenArrow
-
- /p1.h pntArray noOfPoints 1 sub 2 mul 1 add get def
- /p1.v pntArray noOfPoints 1 sub 2 mul get def
- /p2.h pntArray noOfPoints 2 sub 2 mul 1 add get def
- /p2.v pntArray noOfPoints 2 sub 2 mul get def
-
- /width name stringwidth pop def
-
- p1.v p2.v eq {
- /p.v p1.v 7 add def
-
- p1.h p2.h lt {
- /p.h p2.h p1.h sub 2 div width 2 div sub p1.h add def
- }
- {
- /p.h p1.h p2.h sub 2 div width 2 div sub p2.h add def
- } ifelse
- }
- {
- p1.h p2.h eq {
- /p.h p1.h 5 add def
-
- p1.v p2.v lt {
- /p.v p2.v p1.v sub 2 div p1.v add def
- }
- {
- /p.v p1.v p2.v sub 2 div p2.v add def
- } ifelse
- }
- {
- p1.v p2.v lt {
- /p.v p2.v p1.v sub 2 div p1.v add def
- }
- {
- /p.v p1.v p2.v sub 2 div p2.v add def
- } ifelse
-
- p1.h p2.h lt {
- /p.h p2.h p1.h sub 2 div width 2 div sub p1.h add def
- }
- {
- /p.h p1.h p2.h sub 2 div width 2 div sub p2.h add def
- } ifelse
- }ifelse
- } ifelse
-
- p.h p.v moveto name show
-
- end
- } def
-
- /drawEventBox % ulc.x ulc.y height
- {
- 50 dict begin
-
- /height exch def /ulcy exch def /ulcx exch def
-
- newpath 1 setlinewidth
- ulcx ulcy moveto eventBoxWidth 0 rlineto 0 height neg rlineto
- eventBoxWidth neg 0 rlineto closepath
- gsave stroke grestore
- 1 setgray fill
- 0 setgray fill
- end
- } def
-
- /drawEventThread % ulc.x ulc.y height name
- {
- 50 dict begin
-
- /name exch def /height exch def /ulcy exch def /ulcx exch def
-
- newpath 1 setlinewidth
- Monaco10 setfont
- 1 setlinewidth ulcx ulcy moveto 0 height neg rlineto stroke
- ulcx name stringwidth pop 2 div sub ulcy 10 add moveto name show
- end
- } def
-
- /drawEventEvent % fulcx fulcy flrcx flrcy ulcx ulcy lrcx lrcy name dashed
- {
- 50 dict begin
-
- /dashed exch def /name exch def /lrcy exch def /lrcx exch def
- /ulcy exch def /ulcx exch def
- /flrcy exch def /flrcx exch def
- /fulcy exch def /fulcx exch def
-
- Monaco9 setfont
- newpath 1 setlinewidth
- ulcx ulcy lrcx lrcy 1 5 5 dashed true drawArrow
-
- fulcx flrcx gt
- { % above to the left of p1
- /textx fulcx name stringwidth pop 3 add sub def
- /texty fulcy 2 add def
- }
- { % above to the right of p1
- /textx fulcx 4 add def
- /texty fulcy 2 add def
- }ifelse
- textx texty moveto
- name show
- end
- } def
- /drawSupp % pointn ... point1 noOfPoints name drawSupp
- {
- 50 dict begin
-
- /name exch def
- /noOfPoints exch def /pntArray noOfPoints 2 mul array def /index 0 def
- {
- index noOfPoints 2 mul eq { exit } if
- pntArray index 3 -1 roll put
- /index index 1 add def
- } loop
-
- Monaco9 setfont
- [3] 0 setdash
- newpath 1 setlinewidth
- noOfPoints 2 gt {
- /index 0 def
- {
- index noOfPoints 1 sub eq { exit } if
- /p1.h pntArray index 2 mul 1 add get def
- /p1.v pntArray index 2 mul get def
- /p2.h pntArray index 1 add 2 mul 1 add get def
- /p2.v pntArray index 1 add 2 mul get def
- p1.h p1.v moveto p2.h p2.v lineto stroke
- /index index 1 add def
- } loop
- } if
-
- /p1.h pntArray 1 get def
- /p1.v pntArray 0 get def
- /p2.h pntArray 3 get def
- /p2.v pntArray 2 get def
- [] 0 setdash
- p2.h p2.v p1.h p1.v 1 5 5 true drawNavArrow
-
- end
- } def
-
- /fourpops { pop pop pop pop } def
- /drawRoundedBox % ulcx ulcy width height
- {
- 50 dict begin
-
- /height exch def /width exch def
- /ulcy exch def /ulcx exch def
-
- /lrcx ulcx width add def /lrcy ulcy height sub def
-
- ulcx lrcy 10 add moveto
- ulcx lrcy lrcx lrcy 5 arcto fourpops
- lrcx lrcy lrcx ulcy 5 arcto fourpops
- lrcx ulcy ulcx ulcy 5 arcto fourpops
- ulcx ulcy ulcx lrcy 5 arcto fourpops
- closepath
- gsave 1 setgray fill grestore stroke
- end
- } def
-
- /drawStateBox % actionn eventn .. action1 event1 noOfEvents exitlinen exitline1 noOfExitLines dolinen doline1 noOfDoLines entrylinen entryline1 noOfEntryLines name
- {
- 50 dict begin
-
- /boxheight 30 def
- /boxwidth 60 def
- /name exch def
-
- %
- % Get all the entry/ lines and store them in entryLineArray
- %
- /noOfEntryLines exch def
- /entryLineWidth 0 def /entryHeight 0 def
- noOfEntryLines 0 ne
- {
- /entryLineArray noOfEntryLines array def
- /entryLineIndex 0 def
- {
- entryLineIndex noOfEntryLines eq { exit } if
- entryLineArray entryLineIndex 3 -1 roll put
- /entryLineIndex entryLineIndex 1 add def
- } loop
- /entryHeight entryLineIndex 12 mul def
- /rubrikwidth MonacoI9 setfont (entry/ ) stringwidth pop def
- Monaco9 setfont
- entryLineArray
- {
- stringwidth pop dup rubrikwidth add 16 add
- entryLineWidth gt { /entryLineWidth exch def }{ pop } ifelse
- } forall
- } if
-
- %
- % Get all the do: lines and store them in doLineArray
- %
- /noOfDoLines exch def
- /doLineWidth 0 def /doHeight 0 def
- noOfDoLines 0 ne
- {
- /doLineArray noOfDoLines array def
- /doLineIndex 0 def
- {
- doLineIndex noOfDoLines eq { exit } if
- doLineArray doLineIndex 3 -1 roll put
- /doLineIndex doLineIndex 1 add def
- } loop
- /doHeight doLineIndex 12 mul def
- /rubrikwidth Monaco9 setfont (do: ) stringwidth pop def
- doLineArray
- {
- stringwidth pop dup rubrikwidth add 16 add
- doLineWidth gt { /doLineWidth exch def }{ pop } ifelse
- } forall
- } if
-
- %
- % Get all the exit/ lines and store them in exitLineArray
- %
- /noOfExitLines exch def
- /exitLineWidth 0 def /exitHeight 0 def
- noOfExitLines 0 ne
- {
- /exitLineArray noOfExitLines array def
- /exitLineIndex 0 def
- {
- exitLineIndex noOfExitLines eq { exit } if
- exitLineArray exitLineIndex 3 -1 roll put
- /exitLineIndex exitLineIndex 1 add def
- } loop
- /exitHeight exitLineIndex 12 mul def
- /rubrikwidth MonacoI9 setfont (exit/ ) stringwidth pop def
- Monaco9 setfont
- exitLineArray
- {
- stringwidth pop dup rubrikwidth add 16 add
- exitLineWidth gt { /exitLineWidth exch def }{ pop } ifelse
- } forall
- } if
-
- %
- % Get all the event/ lines and store each event in the eventsArray
- % Each element of the eventsArray is another array where the first
- % item holds the number of lines (following items)
- %
- /noOfEvents exch def
- /eventHeight 0 def
- noOfEvents 0 ne
- {
- /eventsArray noOfEvents array def
- /eventIndex 0 def
- {
- eventIndex noOfEvents eq { exit } if
- /noOfEventLines exch def
- /eventArray noOfEventLines 2 add array def
- eventArray 0 noOfEventLines put
- /lineIndex 1 def
- {
- lineIndex noOfEventLines 2 add eq { exit } if
- eventArray lineIndex 3 -1 roll put
- /lineIndex lineIndex 1 add def
- } loop
- eventsArray eventIndex eventArray put
- /eventIndex eventIndex 1 add def
- } loop
-
- /eventLineWidth 0 def
-
- eventsArray
- {
- /ar exch def
- /noOfLines ar 0 get def
- /eventHeight eventHeight noOfLines add def
- /rubrikwidth ar noOfLines 1 add get MonacoI9 setfont stringwidth pop def
- Monaco9 setfont
- /item noOfLines def
- {
- item 0 eq { exit } if
- ar item get Monaco9 setfont stringwidth pop
- rubrikwidth add 16 add dup
- boxwidth gt { /boxwidth exch def }{ pop } ifelse
- /item item 1 sub def
- } loop
- } forall
- /eventHeight eventHeight 10 mul def
- } if
-
- currentpoint /ulcy exch def /ulcx exch def
- /leftmargin currentpoint pop def /topmargin currentpoint exch pop def
-
- Monaco10 setfont
- name stringwidth pop dup 8 add
- boxwidth gt { /boxwidth exch def }{ pop } ifelse
-
- entryLineWidth boxwidth gt { /boxwidth entryLineWidth def } if
- doLineWidth boxwidth gt { /boxwidth doLineWidth def } if
- exitLineWidth boxwidth gt { /boxwidth exitLineWidth def } if
-
- 30 exitHeight add doHeight add entryHeight add eventHeight add dup
- boxheight gt { /boxheight exch def }{ pop } ifelse
-
- % Draw the name of the state
- Monaco10 setfont
- ulcx ulcy boxwidth boxheight drawRoundedBox
- ulcx boxwidth name stringwidth pop sub 2 div add
- ulcy 18 sub moveto name show
-
- /entryIndex 0 def
- entryHeight 0 ne
- {
- /item noOfEntryLines 1 sub def
- {
- item -1 eq { exit }if
- entryLineArray item get
- /item item 1 sub def
- ulcx 5 add ulcy 30 sub entryIndex 10 mul sub moveto
- entryIndex 0 eq { MonacoI9 setfont (entry/ ) show
- /leftmargin currentpoint pop ulcx 5 add sub def Monaco9 setfont }
- { leftmargin 0 rmoveto } ifelse
- show
- /entryIndex entryIndex 1 add def
- } loop
- } if
- Monaco9 setfont
- /doIndex 0 def
- doHeight 0 ne
- {
- /item noOfDoLines 1 sub def
- {
- item -1 eq { exit }if
- doLineArray item get
- /item item 1 sub def
- ulcx 5 add ulcy 30 sub doIndex 10 mul sub entryIndex 10 mul sub moveto
- doIndex 0 eq { (do: ) show /leftmargin currentpoint pop ulcx 5 add sub def }{ leftmargin 0 rmoveto } ifelse
- show
- /doIndex doIndex 1 add def
- } loop
- } if
-
- /eventIndex 0 def
- eventHeight 0 ne
- {
- /item noOfEvents 1 sub def
- {
- item -1 eq { exit }if
- /ar eventsArray item get def
- /item item 1 sub def
- /noOfLines ar 0 get def
- /lineIndex noOfLines 1 add def
- {
- lineIndex 0 eq { exit } if
- ar lineIndex get
- ulcx 5 add ulcy 32 sub entryIndex 10 mul sub doIndex 10 mul sub eventIndex 10 mul sub moveto
- lineIndex noOfLines 1 add eq
- {
- MonacoI9 setfont show ( ) show /leftmargin currentpoint pop ulcx 5 add sub def
- ar noOfLines get Monaco9 setfont show
- /lineIndex lineIndex 2 sub def
- }
- {
- leftmargin 0 rmoveto show
- /lineIndex lineIndex 1 sub def
- }ifelse
- /eventIndex eventIndex 1 add def
- } loop
- } loop
- } if
-
- /exitIndex 0 def
- exitHeight 0 ne
- {
- /item noOfExitLines 1 sub def
- {
- item -1 eq { exit }if
- exitLineArray item get
- /item item 1 sub def
- ulcx 5 add ulcy 32 sub entryIndex 10 mul sub doIndex 10 mul sub eventIndex 10 mul sub exitIndex 10 mul sub moveto
- exitIndex 0 eq { MonacoI9 setfont (exit/ ) show
- /leftmargin currentpoint pop ulcx 5 add sub def
- Monaco9 setfont } { leftmargin 0 rmoveto }ifelse
- show
- /exitIndex exitIndex 1 add def
- } loop
- } if
- leftmargin boxwidth add topmargin boxheight sub
- end
- } def
-
- /drawStateEvent % [ pointn ... point1 ] noOfPoints eventtext
- {
- 50 dict begin
- Monaco9 setfont
-
- /eventtext exch def
-
- /noOfPoints exch def /pntArray noOfPoints 2 mul array def /index 0 def
- {
- index noOfPoints 2 mul eq { exit } if
- pntArray index 3 -1 roll put
- /index index 1 add def
- } loop
-
- newpath 1 setlinewidth 0 setgray
- /index 0 def
- {
- index noOfPoints eq { exit } if
- pntArray index 2 mul 1 add get pntArray index 2 mul get
- index 0 eq { moveto }{ lineto } ifelse
- /index index 1 add def
- } loop
- stroke
- pntArray noOfPoints 1 sub 2 mul 1 add get pntArray noOfPoints 1 sub 2 mul get
- pntArray noOfPoints 2 sub 2 mul 1 add get pntArray noOfPoints 2 sub 2 mul get
-
- %
- % Last line's x and y are on top of the stack
- %
- /p1.v exch def
- /p1.h exch def
- /p2.v exch def
- /p2.h exch def
- /width eventtext stringwidth pop def
-
- p1.v p2.v eq
- {
- /p.v p1.v 7 add def
- p1.h p2.h lt
- {
- /p.h p1.h p2.h p1.h sub 2 div add width 2 div sub def
- }
- {
- /p.h p2.h p1.h p2.h sub 2 div add width 2 div sub def
- }ifelse
- }
- {
- p1.h p2.h eq
- {
- /p.h p1.h 5 add def
- p1.v p2.v ge
- {
- /p.v p1.v p2.v p1.v sub 2 div add def
- }
- {
- /p.v p2.v p1.v p2.v sub 2 div add def
- }ifelse
- }
- {
- p1.v p2.v ge
- {
- /p.v p1.v p2.v p1.v sub 2 div add def
- }
- {
- /p.v p2.v p1.v p2.v sub 2 div add def
- }ifelse
-
- p1.h p2.h lt
- {
- /p.h p1.h p2.h p1.h sub 2 div width 2 div sub add def
- }
- {
- /p.h p2.h p1.h p2.h sub 2 div width 2 div sub add def
- }ifelse
- }ifelse
- }ifelse
-
- MonacoI9 setfont
- p.h p.v moveto eventtext show
-
- pntArray 1 get pntArray 0 get
- /p1.v exch def /p1.h exch def
- pntArray 3 get pntArray 2 get
- /p2.v exch def /p2.h exch def
-
- p1.h p2.h eq
- {
- p1.v p2.v gt
- {
- /p1.v p1.v 5 sub def
- }
- {
- /p1.v p1.v 5 add def
- }ifelse
- }
- {
- p1.h p2.h gt
- {
- /p1.h p1.h 5 sub def
- }
- {
- /p1.h p1.h 5 add def
- }ifelse
- } ifelse
- p2.h p2.v p1.h p1.v 1 5 5 false true drawArrow
-
- end
- } def
-
- /drawNote % linen line1 noOfLines width height drawNote
- {
- 50 dict begin
-
- /boxheight exch def
- /boxwidth exch def
-
- %
- % Get all the lines and store them in lineArray
- %
- Monaco9 setfont
-
- /noOfLines exch def
- noOfLines 0 ne
- {
- /lineArray noOfLines array def
- /lineIndex 0 def
- {
- lineIndex noOfLines eq { exit } if
- lineArray lineIndex 3 -1 roll put
- /lineIndex lineIndex 1 add def
- } loop
- } if
-
- currentpoint /ulcy exch def /ulcx exch def
-
- % compute max width of text lines
- /maxwidth 0 def
- noOfLines 0 ne
- {
- /item noOfLines 1 sub def
- {
- item -1 eq { exit }if
- lineArray item get
- stringwidth pop
- /width exch def
- maxwidth width lt { /maxwidth width def }if
- /item item 1 sub def
- } loop
- } if
- boxwidth maxwidth lt { /boxwidth maxwidth def }if
-
- % draw the box
- currentpoint boxwidth 0 rlineto
- 0 boxheight neg rlineto
- boxwidth neg 0 rlineto closepath stroke
-
- % set clipping region
- gsave
- newpath
- ulcx 5 add ulcy moveto
- boxwidth 10 sub 0 rlineto
- 0 boxheight neg rlineto
- boxwidth 10 sub neg 0 rlineto closepath clip
-
- /index 0 def
- noOfLines 0 ne
- {
- /item noOfLines 1 sub def
- {
- item -1 eq { exit }if
- lineArray item get
- /item item 1 sub def
- ulcx 5 add ulcy 12 sub index 10 mul sub moveto
- show
- /index index 1 add def
- } loop
- } if
- grestore
- newpath
- ulcx boxwidth add 14 sub ulcy moveto
- 14 0 rlineto
- 0 -10 rlineto closepath gsave stroke grestore 0.5 setgray fill
-
- 2 setlinejoin
- ulcx boxwidth add 14 sub ulcy moveto
-
- ulcx boxwidth add 12 sub ulcy 3 sub % x1, y1
- ulcx boxwidth add 11 sub ulcy 5 sub % x2, y2
- ulcx boxwidth add 12 sub ulcy 10 sub % x3, y3
- curveto
-
- ulcx boxwidth add 9 sub ulcy 8 sub % x1, y1
- ulcx boxwidth add 4 sub ulcy 8 sub % x2, y2
- ulcx boxwidth add ulcy 10 sub % x3, y3
- curveto
-
- closepath gsave 1 setgray fill grestore 0 setgray stroke
- 0 setlinejoin
-
- ulcx boxwidth add ulcy boxheight sub
-
- end
- } def
-
-
- /drawInitialState % diameter x y drawInitialState
- {
- 50 dict begin
-
- /y exch def
- /x exch def
- /circleSize exch def
- newpath
- x circleSize 2 div add
- y circleSize 2 div sub
- circleSize 2 div
- 0 360 arc
- closepath gsave stroke grestore fill
-
- end
- } def
-
- /drawFinalState % diameter x y drawFinalState
- {
- 50 dict begin
-
- /y exch def
- /x exch def
- /circleSize exch def
- newpath
- x circleSize 2 div add
- y circleSize 2 div sub
- circleSize 2 div
- 0 360 arc
- closepath stroke
- newpath
- x circleSize 2 div add
- y circleSize 2 div sub
- circleSize 2 div 3 sub
- 0 360 arc
- closepath fill
-
- end
- } def
-
- /drawActor % name
- {
- 50 dict begin
-
- /actorheight 75 def
- /actorwidth 30 def
- /name exch def
-
- currentpoint /ulcy exch def /ulcx exch def
- /leftmargin currentpoint pop def /topmargin currentpoint exch pop def
-
- Monaco10 setfont
- /namewidth name stringwidth pop def
-
- /nameleft ulcx actorwidth 2 div add namewidth 2 div sub def
-
- % Draw the name of the actor
- nameleft ulcy actorheight sub 5 add moveto name show
-
- % Draw the stickman
-
- % First head
- newpath
- ulcx actorwidth 2 div add % x
- ulcy 10 sub % y
- 10 % r
- 0 360 arc stroke
-
- % then body
- newpath
- ulcx actorwidth 2 div add ulcy 20 sub moveto
- ulcx actorwidth 2 div add ulcy 20 sub actorheight 45 sub sub lineto
-
- % then the legs
- actorwidth 2 div 1 sub neg -10 rlineto
- actorwidth 2 div 10 rmoveto
- actorwidth 2 div -10 rlineto
-
- % then the arms
- ulcx ulcy 35 sub moveto
- actorwidth 2 div 5 rlineto
- actorwidth 2 div 1 sub -5 rlineto
- stroke
-
- leftmargin actorwidth add topmargin actorheight sub
- end
- } def
-
- /drawPackage % name
- {
- 50 dict begin
-
- /packageheight 50 def
- /packagewidth 80 def
- /name exch def
-
- currentpoint /ulcy exch def /ulcx exch def
- /leftmargin currentpoint pop def /topmargin currentpoint exch pop def
-
- Monaco10 setfont
- /namewidth name stringwidth pop def
-
- namewidth 6 add packagewidth gt { /packagewidth namewidth 6 add def } if
-
- /nameleft ulcx packagewidth 2 div add namewidth 2 div sub def
-
- ulcx ulcy 10 sub moveto
- ulcx packagewidth add ulcy 10 sub lineto
- ulcx packagewidth add ulcy packageheight sub 1 add lineto
- ulcx ulcy packageheight sub 1 add lineto
- closepath stroke
- newpath
- ulcx ulcy moveto
- ulcx 30 add ulcy lineto
- ulcx 30 add ulcy 10 sub lineto
- ulcx ulcy 10 sub lineto
- closepath stroke
-
- newpath
- nameleft ulcy 25 sub moveto
- name show
-
- leftmargin packagewidth add topmargin packageheight sub
- end
- } def
- /drawFrame % width height
- {
- 50 dict begin
-
- /frameheight exch def
- /framewidth exch def
-
- currentpoint /ulcy exch def /ulcx exch def
- /leftmargin currentpoint pop def /topmargin currentpoint exch pop def
-
- ulcx framewidth add ulcy lineto
- ulcx framewidth add ulcy frameheight sub 1 add lineto
- ulcx ulcy frameheight sub 1 add lineto
- closepath stroke
-
- leftmargin framewidth add topmargin frameheight sub
- end
- } def
-
- /drawUseCase % name
- {
- 50 dict begin
-
- /usecaseheight 50 def
- /usecasewidth 90 def
- /name exch def
-
- currentpoint /ulcy exch def /ulcx exch def
- /leftmargin currentpoint pop def /topmargin currentpoint exch pop def
-
- Monaco10 setfont
- /namewidth name stringwidth pop def
-
- namewidth 6 add usecasewidth gt { /usecasewidth namewidth 6 add def } if
-
- /nameleft ulcx usecasewidth 2 div add namewidth 2 div sub def
-
- newpath
- ulcx usecasewidth 2 div add ulcy usecaseheight 2 div sub translate
- usecasewidth usecaseheight div 1 scale
- 0 0 usecaseheight 2 div 0 360 arc
- usecaseheight usecasewidth div 1 scale
- ulcx usecasewidth 2 div add neg ulcy usecaseheight 2 div sub neg translate
- stroke
-
- newpath
- nameleft ulcy 25 sub moveto
- name show
-
- leftmargin usecasewidth add topmargin usecaseheight sub
- end
- } def
-
- /drawText % linen line1 noOfLines typeface size drawText
- {
- 50 dict begin
-
- /size exch def
- /typeface exch def
-
- %
- % Get all the lines and store them in lineArray
- %
- % stdencoding typeface RE findfont size scalefont def
- typeface findfont size scalefont setfont
-
- /noOfLines exch def
- noOfLines 0 ne
- {
- /lineArray noOfLines array def
- /lineIndex 0 def
- {
- lineIndex noOfLines eq { exit } if
- lineArray lineIndex 3 -1 roll put
- /lineIndex lineIndex 1 add def
- } loop
- } if
-
- currentpoint /ulcy exch def /ulcx exch def
-
- % compute max width of text lines
- /maxwidth 0 def
- noOfLines 0 ne
- {
- /item noOfLines 1 sub def
- {
- item -1 eq { exit }if
- lineArray item get
- stringwidth pop
- /width exch def
- maxwidth width lt { /maxwidth width def }if
- /item item 1 sub def
- } loop
- } if
-
- /index 0 def
- noOfLines 0 ne
- {
- /item noOfLines 1 sub def
- {
- item -1 eq { exit }if
- lineArray item get
- /item item 1 sub def
- ulcx 5 add ulcy 12 sub index 10 mul sub moveto
- show
- /index index 1 add def
- } loop
- } if
-
- end
- } def
-
- /drawCommunicates % pointn ... point1 noOfPoints name
- {
- 50 dict begin
- Monaco9 setfont
-
- /name exch def
- /noOfPoints exch def /pntArray noOfPoints 2 mul array def /index 0 def
- {
- index noOfPoints 2 mul eq { exit } if
- pntArray index 3 -1 roll put
- /index index 1 add def
- } loop
-
- newpath 1 setlinewidth 0 setgray
- /index 0 def
- {
- index noOfPoints eq { exit } if
- pntArray index 2 mul 1 add get pntArray index 2 mul get
- % index noOfPoints 1 sub eq { pop pop lineConnect.h lineConnect.v } if
- index 0 eq { moveto }{ lineto } ifelse
- /index index 1 add def
- } loop
- stroke
- end
- } def
-
- newpath 1 setlinewidth
- 0 setgray
-